package org.chnxi.leetcode.problems.ques2;


/**
 * 使用对应位置求和计算
 * 执行用时 :2 ms, 在所有 Java 提交中击败了99.92%的用户
 * 内存消耗 :39.8 MB, 在所有 Java 提交中击败了94.26%的用户
 */
public class Simple1 {

    public static void main(String[] args) {
        ListNode l1_0 = new ListNode(1);
//        ListNode l1_1 = new ListNode(4);
//        ListNode l1_2 = new ListNode(3);
//        l1_0.next = l1_1;
//        l1_1.next = l1_2;

        ListNode l2_0 = new ListNode(9);
        ListNode l2_1 = new ListNode(9);
//        ListNode l2_2 = new ListNode(4);
        l2_0.next = l2_1;
//        l2_1.next = l2_2;

        ListNode result = addTwoNumbers(l1_0, l2_0);
        System.out.println(result);
    }

    public static ListNode addTwoNumbers(ListNode l1, ListNode l2) {

        boolean carry = false; // 记录是否进位，true进位，false不进位

        ListNode result = null; //返回结果时使用

        while(true){
            //当l1、l2都为空并且carry为false（不需要进位）的时候退出循环
            if(l1 ==null && l2 == null && carry == false){
                break;
            }
            //防止l1和l2其中任何一个为空时出现错误
            int num1 = l1 == null ? 0 : l1.val;
            int num2 = l2 == null ? 0 : l2.val;

            //sum不对10取余，后续需要整体判断
            int sum = num1 + num2;

            if(result == null){ //个位
                result = new ListNode(sum % 10 );
            }else{
                //非个位需要考虑进位过来的1
                sum = (sum  + (carry == true ? 1 : 0));
                ListNode ln = new ListNode(sum % 10);

                //将节点放入最后
                ListNode tmp = result;
                while (tmp.next != null){
                    tmp = tmp.next;
                }
                tmp.next = ln;

            }
            //判断进位与l1、l2的向后滚动
            carry = sum >= 10 ? true : false;
            l1 = l1 == null ? null : l1.next;
            l2 = l2 == null ? null : l2.next;
        }

        return result;
    }
}
